/*
 * Copyright 2002-2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Marks a constructor, field, setter method or config method as to be autowired by Spring's dependency injection
 * facilities.
 * <p>
 * Only one constructor (at max) of any given bean class may carry this annotation, indicating the constructor to
 * autowire when used as a Spring bean. Such a constructor does not have to be public.
 * <p>
 * Fields are injected right after construction of a bean, before any config methods are invoked. Such a config field
 * does not have to be public.
 * <p>
 * Config methods may have an arbitrary name and any number of arguments; each of those arguments will be autowired with
 * a matching bean in the Spring container. Bean property setter methods are effectively just a special case of such a
 * general config method. Such config methods do not have to be public.
 * <p>
 * In the case of multiple argument methods, the 'required' parameter is applicable for all arguments.
 * <p>
 * In case of a {@link java.util.Collection} or {@link java.util.Map} dependency type, the container will autowire all
 * beans matching the declared value type. In case of a Map, the keys must be declared as type String and will be
 * resolved to the corresponding bean names.
 * <p>
 * Please do consult the javadoc for the {@link AutowiredAnnotationBeanPostProcessor} class (which, by default, checks
 * for the presence of this annotation).
 * 
 * @author Juergen Hoeller
 * @author Mark Fisher
 * @since 2.5
 * @see AutowiredAnnotationBeanPostProcessor
 */
@Retention( RetentionPolicy.RUNTIME )
@Target( { ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD } )
public @interface Autowired
{

    /**
     * Declares whether the annotated dependency is required.
     * <p>
     * Defaults to <code>true</code>.
     */
    boolean required() default true;

}
